package administracion;

import java.rmi.RemoteException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import dao.AdministracionCentralDAO;
import dao.EmpleadoDAO;
import dao.PlanProduccionDAO;
import dao.ProductoDAO;
import dao.SucursalDAO;
import dto.EmpleadoDTO;
import dto.PlanProduccionDTO;
import dto.TareaDTO;
import entity.AdministracionCentral;
import entity.ElaboradoVenta;
import entity.Empleado;
import entity.Lote;
import entity.Movimiento;
import entity.PlanProduccion;
import entity.Producto;
import entity.Sucursal;
import entity.Tarea;

public class PlanProduccionManager {

	private static PlanProduccionManager instancia;
	private PlanProduccionDAO dao = PlanProduccionDAO.getInstancia();
	
	private PlanProduccionManager() {
		
	}
	
	public static PlanProduccionManager getInstancia(){
		if(instancia == null)
			instancia = new PlanProduccionManager();
		return instancia;
	}

	public PlanProduccionDTO getPlanProduccion() throws RemoteException {
		PlanProduccion p = dao.getInstancia().getPlanProduccion();
		
		if(p != null){
			return p.getDTO();
		}else{
			throw new RemoteException("No existe un Plan de Produccion Activo");
		}
	}
	
	public boolean altaTarea(EmpleadoDTO e2, TareaDTO t) throws RemoteException {
		
		Sucursal s = SucursalDAO.getInstancia().buscarSucursalNombre(t.getSucursal().getNombre());
		ElaboradoVenta p = ProductoDAO.getInstancia().buscarProductoCodigo(t.getProducto().getCodigo());
		//AdministracionCentral adm = AdministracionCentralDAO.getInstancia().getAdministracionCentral();
		Empleado emp = EmpleadoDAO.getInstancia().getEmpleadoLegajo(e2.getLegajo());
		
		boolean verif = AdministracionCentralManager.getInstancia().verificarStockDepositoCentral(p, t.getCantidad());
		
		if(verif == true){ //Hay stock disponible para cumplir la tarea
			
			//Recupero los lotes que sera utilizados para la tarea.
			//List<Lote> lotes = DepositoManager.getInstancia().lotesProductosTarea(p);
			
			//Creo el movimiento de mercaderia que va al deposito del area correspondiente
			MovimientoManager.getInstancia().altaMovimiento(s,emp,p,t.getCantidad());
			
			//Recupero la sucursal actualizada
			s = SucursalDAO.getInstancia().buscarSucursalNombre(t.getSucursal().getNombre());
			
			//Creo la tarea
			Tarea tarea = new Tarea();
			tarea.setSucursal(s);
			tarea.setProducto(p);
			tarea.setCantidad(t.getCantidad());
			tarea.setEstado(t.getEstado());
			tarea.setTiempoRequerido(t.getTiempoRequerido());
			
			//Actualizo el plan de produccion
			PlanProduccion plan = dao.getPlanProduccion();
			plan.getTareas().add(tarea);
			
			//Actualizo todo
			dao.update(plan);
			
		}else{
			
			throw new RemoteException("No hay stock suficiente para realizar dicha tarea");
			
		}
		
		return verif;
		
		
		
	}
}
